962
3405
Haluatko parantaa tätä viestiä? Anna yksityiskohtaiset vastaukset tähän kysymykseen, mukaan lukien sitaatit ja selitys miksi vastauksesi on oikea. Vastauksia, joissa ei ole riittävästi yksityiskohtia, voidaan muokata tai poistaa.
Lisäsin tiedostot vahingossa Gitiin komennolla:
git lisää myfile.txt
En ole vielä suorittanut sitoutumista. Onko mahdollista kumota tämä, joten näitä tiedostoja ei sisällytetä sitoutumiseen? 
1
2
Seuraava
Voit kumota git add ennen sitoutumista
git reset 
joka poistaa sen nykyisestä hakemistosta ("sitoutuu" -luettelosta) muuttamatta mitään muuta.
Voit käyttää
git nollaus
ilman mitään tiedostonimeä kaikkien tarvittavien muutosten poistamiseksi. Tästä voi olla hyötyä, kun tiedostoja on liian monta, jotta ne voidaan luetella yksitellen kohtuullisessa ajassa.
Gitin vanhoissa versioissa yllä olevat komennot vastaavat git reset HEAD  ja git reset HEAD vastaavasti ja epäonnistuvat, jos HEAD on määrittelemätön (koska et ole vielä tehnyt mitään muutoksia arkistossa) tai epäselvä (koska loi haaran nimeltä HEAD, joka on tyhmä asia, jota sinun ei pitäisi tehdä). Tätä muutettiin kuitenkin Git 1.8.2: ssa, joten Gitin nykyaikaisissa versioissa voit käyttää yllä olevia komentoja jo ennen ensimmäisen sitoutumisen tekemistä:
"git reset" (ilman vaihtoehtoja tai parametreja) käytetään virheilmoitukseen milloin
sinulla ei ole historiassasi mitään sitoumuksia, mutta se antaa sinulle nyt
tyhjä hakemisto (vastaamaan olematonta sitoutumista et ole edes päällä).
Dokumentaatio: git reset
|
Haluat:
git rm - välimuisti 
Perustelut:
Kun olin uusi tässä, yritin ensin
git nollaus.
(kumoamaan koko alkuperäisen lisäyksen), vain saadaksesi tämän (ei niin) hyödyllisen viestin:
kohtalokas: 'HEAD' ei ratkennut kelvollisena viitteenä.
On käynyt ilmi, että tämä johtuu siitä, että HEAD-viite (haara?) On olemassa vasta ensimmäisen sitoutumisen jälkeen. Eli kohtaat saman aloittelijan ongelman kuin minä, jos työnkulkumme, kuten minunkin, olisi jotain:
cd uuteen upeaan projektihakemistooni kokeilemaan uutta kuumuutta Git
git init
git lisää.
git-tila
... paljon paskaa vierittää ...
=> Hitto, en halunnut lisätä kaikkea sitä.
google "kumoa git-lisäys"
=> etsi Stack Overflow - yay
git nollaus.
=> kohtalokas: 'HEAD': n ratkaiseminen kelvollisena viitteenä epäonnistui
Lisäksi osoittautuu, että postituslistalla on virhe, joka on kirjattu tämän hyödyttömyydestä.
Ja että oikea ratkaisu oli oikeassa siellä Git-tilaulostulossa (joka kyllä, minä kiillotin "paska")
...
# Tehdyt muutokset:
# (käytä "git rm --cached  ..." lavalle)
...
Ja ratkaisu on todellakin käyttää git rm -välimuistitiedostoa.
Huomaa varoitukset muualla täällä - git rm poistaa tiedoston paikallisen työkopion, mutta ei, jos käytät --cached. Tässä on git help rm -tulos:
- välimuisti
Käytä tätä vaihtoehtoa poistaaksesi vaiheet ja poistaaksesi polut vain hakemistosta.
Toimivat puutiedostot, riippumatta siitä, onko niitä muokattu vai ei, jätetään.
Jatkan käyttöä
git rm - välimuisti.
Poista kaikki ja aloita uudestaan. Ei toiminut, koska vaikka lisää. on rekursiivinen, osoittautuu, että rm tarvitsee -r: n toistumaan. Huokaus.
git rm -r - välimuisti.
Okei, nyt olen palannut alkuun. Seuraavan kerran aion käyttää -n: tä kuivakäyntiin ja nähdä, mitä lisätään:
git add -n.
Pakkasin kaiken turvalliseen paikkaan, ennen kuin luotin siihen, että välimuisti ei tuhoa mitään (ja mitä jos kirjoitin väärin).
|
Jos kirjoitat:
git-tila
Git kertoo sinulle, mitä järjestetään jne., Mukaan lukien ohjeet lavasta poistumiseen:
käytä "git reset HEAD  ..." poistuaksesi lavasta
Minusta Git tekee melko hyvää työtä työntämällä minua tekemään oikean asian tällaisissa tilanteissa.
Huomaa: Viimeaikaiset Git-versiot (1.8.4.x) ovat muuttaneet tätä viestiä:
(poista lavasta "git rm --cached  ...")
|
Selvennykseksi: git add siirtää muutokset nykyisestä työhakemistosta lavastusalueelle (hakemisto).
Tätä prosessia kutsutaan lavastukseksi. Joten luonnollisin komento muutosten (muutettujen tiedostojen) vaiheistamiseksi on ilmeinen:
git-vaihe
git add on vain helpompi kirjoittaa alias git-vaiheelle
Sääli, ettei ole git unstage- tai git undd -komentoja. Asiaa on vaikea arvata tai muistaa, mutta se on melko ilmeinen:
git reset HEAD -
Voimme helposti luoda aliaksen tälle:
git config --global alias.unadd 'nollaa HEAD -'
git config --global alias.unstage 'reset HEAD -'
Ja lopuksi meillä on uudet komennot:
git lisää tiedosto 1
git-vaihetiedosto 2
git undd-tiedosto 2
git-vaiheittainen tiedosto 1
Henkilökohtaisesti käytän vielä lyhyempiä aliaksia:
git a # Lavastusta varten
git u # Pysähtymättömäksi
|
Lisäys hyväksyttyyn vastaukseen, jos virheellisesti lisätty tiedosto oli valtava, huomaat todennäköisesti, että vaikka poistaisit sen hakemistosta 'git reset' -toiminnolla, se näyttää silti vievän tilaa .git-hakemistossa.
Tämä ei ole mikään huolestuttava; tiedosto on todellakin edelleen arkistossa, mutta vain "löysänä objektina". Sitä ei kopioida muihin arkistoihin (kloonin, pushin kautta), ja tila lopulta otetaan talteen - vaikkakaan ei kovin pian. Jos olet ahdistunut, voit juosta:
git gc --prune = nyt
Päivitys (seuraava on yritys yrittää poistaa hämmennys, joka voi syntyä eniten äänestetyistä vastauksista):
Joten mikä on git addin todellinen kumoaminen?
git reset HEAD ?
tai
git rm - välimuisti ?
Tarkkaan ottaen, ja jos en erehdy: ei ketään.
git addia ei voi kumota - yleensä turvallisesti.
Muistetaan ensin, mitä git add  todella tekee:
Jos  ei aiemmin seurattu, git add lisää senvälimuisti ja sen nykyinen sisältö.
Jos  oli jo seurattu, git add tallentaa nykyisen sisällön (tilannekuvan, version) välimuistiin. Gitissä tätä toimintoa kutsutaan edelleen addiksi (ei pelkästään päivitä sitä), koska tiedoston kahta erilaista versiota (tilannevedosta) pidetään kahtena eri kohteena: näin ollen lisäämme välimuistiin todellakin uuden kohteen, joka on lopulta tehty myöhemmin.
Tämän valossa kysymys on hieman epäselvä:
Lisäsin tiedostot vahingossa komennolla ...
OP: n skenaario näyttää olevan ensimmäinen (jäljittämätön tiedosto), haluamme, että "kumoa" poistaa tiedoston (ei vain nykyisen sisällön) seuratuista kohteista. Jos näin on, on hyvä suorittaa git rm --cached .
Ja voisimme myös suorittaa git reset HEAD . Tämä on yleensä suositeltavaa, koska se toimii molemmissa tilanteissa: se myös kumoa, kun lisäsimme väärin jo seuratun kohteen version.
Mutta on olemassa kaksi varoitusta.
Ensimmäinen: On (kuten vastauksessa todettiin) vain yksi skenaario, jossa git reset HEAD ei toimi, mutta git rm --cached toimii: uusi arkisto (ei sitoumuksia). Mutta oikeastaan ​​tämä on käytännössä merkityksetön tapaus.
Toinen: Huomaa, että git reset HEAD ei voi maagisesti palauttaa aiemmin välimuistissa olevan tiedoston sisällön, vaan se vain synkronoi sen uudelleen HEADista. Jos väärä git-lisäyksemme kirjoitti aikaisemman vaiheittaisen sitomattoman version, emme voi palauttaa sitä. Siksi emme voi tiukasti ottaen kumota [*].
Esimerkki:
$ git init
$ echo "version 1"> tiedosto.txt
$ git add file.txt # Lisää ensin tiedosto.txt
$ git sitoutuminen -m 'ensimmäinen sitoutuminen'
$ echo "version 2"> tiedosto.txt
$ git add file.txt # Vaihe (älä sitoudu) file.txt: n "versio 2"
$ git diff --välimuisti tiedosto.txt
-versio 1
+ versio 2
$ echo "version 3"> tiedosto.txt
$ git diff tiedosto.txt
-versio 2
+ versio 3
$ git add file.txt # Hups, emme tarkoittaneet tätä
$ git reset HEAD file.txt # Kumotaanko?
$ git diff --cached file.txt # Ei tietenkään eroa. vaihe == PÄÄ
$ git diff file.txt # "versio 2" on peruuttamattomasti kadonnut
-versio 1
+ versio 3
Tämä ei tietenkään ole kovin kriittistä, jos noudatamme tavallista laiskaa työnkulkua, jossa 'git add' tehdään vain uusien tiedostojen lisäämiseksi (tapaus 1), ja päivitämme uuden sisällön komennolla sitoutu, git sitoutu -a.
* (Muokkaa: yllä oleva on käytännössä oikein, mutta silti voi olla joitain hakkerisia / mutkikkaita tapoja palauttaa vaiheitetut, mutta sitoutumattomat ja sitten korvatut muutokset - katso Johannes Matokicin ja iolsmitin kommentit)
|
Git: llä on melko helppoa kumota jo lisätty tiedosto. Käytä jo lisättyjä myfile.txt-tiedostojen palauttamiseen:
git reset HEAD myfile.txt
Selitys:
Kun olet lavastanut ei-toivotut tiedostot, voit kumota ne tekemällä git-palautuksen. Head on tiedostosi pää paikallisessa ja viimeinen parametri on tiedostosi nimi.
Olen luonut alla olevan kuvan vaiheet tarkemmin sinulle, mukaan lukien kaikki vaiheet, joita voi tapahtua näissä tapauksissa:
|
git rm - välimuisti. -r
"poistaa" kaiken nykyiseen hakemistoon lisäämäsi rekursiivisesti
|
Juosta
git gui
ja poista kaikki tiedostot manuaalisesti tai valitsemalla ne kaikki ja napsauttamalla unstage fromaksid -painiketta.
|
Kysymystä ei esitetä selvästi. Syynä on se, että git addilla on kaksi merkitystä:
lisäämällä uusi tiedosto lavastusalueelle ja kumoamalla sitten git rm - välimuistitiedosto.
lisäämällä muokattu tiedosto lavastusalueelle ja kumoamalla sitten git reset HEAD -tiedosto.
Jos olet epävarma, käytä
git nollaa HEAD-tiedosto
Koska se tekee odotetun asian molemmissa tapauksissa.
Varoitus: jos teet git rm - välimuistitiedoston muokatulle tiedostolle (tiedosto, joka oli aiemmin olemassa arkistossa), tiedosto poistetaan git commitista! Se on edelleen olemassa tiedostojärjestelmässäsi, mutta jos joku muu vetää sitoutumisesi, tiedosto poistetaan heidän työpuunsa.
git-tila kertoo, oliko tiedosto uusi tiedosto vai muokattuko se:
Haaratoimistossa
Tehdyt muutokset:
(poistu lavasta käyttämällä "git reset HEAD  ...")
uusi tiedosto: my_new_file.txt
muokattu: my_modified_file.txt
|
Gitillä on käskyjä jokaiselle kuviteltavalle toiminnalle, mutta se tarvitsee laajaa tietoa saadakseen asiat oikein ja siksi se on parhaimmillaankin intuitiivista ...
Mitä teit aiemmin:
Muutti tiedostoa ja käytti git add. Tai git add .
Mitä sinä haluat:
Poista tiedosto hakemistosta, mutta pidä se versiona ja jätä tekemättä muutoksia työkopioon:
git reset HEAD 
Palauta tiedosto viimeiseen tilaan HEADista, kumoamalla muutokset ja poistamalla ne hakemistosta:
# Ajattele `svn revert ` IIRC.
git reset HEAD 
git checkout 
# Jos sinulla on `` niminen kuten , käytä:
git-kassa - 
Tätä tarvitaan, koska git reset --hard HEAD ei toimi yksittäisten tiedostojen kanssa.
Poista  hakemistosta ja versiosta pitämällä versioton tiedosto muutoksineen työkopiossa:
git rm - välimuisti 
Poista  työkopiosta ja versiosta kokonaan:
git rm 
|
Jos olet tekemässä alkuperäistä sitoutumistasi etkä voi käyttää git-tiedostoapalauta, julista vain "konkurssi", poista .git-kansio ja aloita alusta
|
Kuten monissa muissa vastauksissa, voit käyttää git reset -toimintoa
MUTTA:
Löysin tämän suuren pienen viestin, joka todella lisää Git-komennon (hyvin, aliaksen) git unadd: katso lisätietoja git unadd tai ..
Yksinkertaisesti,
git config --global alias.unadd "reset HEAD"
Nyt voit
git unadd foo.txt bar.txt
|
Käytä git add -i poistaaksesi juuri lisätyt tiedostot tulevasta sitoutumisesta. Esimerkki:
Halutun tiedoston lisääminen:
$ git lisää foo
$ git-tila
# Haaran päällikkö
# Tehdyt muutokset:
# (käytä "git reset HEAD  ..." poistuaksesi lavasta)
#
# uusi tiedosto: foo
#
# Seurattavat tiedostot:
# (käytä "git add  ..." sisällyttääksesi mitä sitoudutaan)
# [...] #
Siirtyminen interaktiiviseen lisäykseen kumoamisen lisäämiseksi (git: llä kirjoitetut komennot ovat "r" (palautus), "1" (luettelon palautuksen ensimmäinen merkintä näkyy), "palaa" palataksesi pois palautustilasta ja "q" (lopettaa):
$ git lisää -i
lavastettu vaiheittainen polku
1: + 1 / -0 ei mitään
*** Komennot ***
1: [s] tila 2: [u] pdate 3: [r] evert 4: [a] dd jäljittämätön
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Mitä nyt> r
lavastettu vaiheittainen polku
1: + 1 / -0 mitään [f] oo
Palauta >> 1
lavastettu vaiheittainen polku
* 1: + 1 / -0 ei mitään [f] oo
Palauta >>
Huomaa: foo on nyt jäljittämättä.
palasi yhden polun
*** Komennot ***
1: [s] tila 2: [u] pdate 3: [r] evert 4: [a] dd jäljittämätön
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Mitä nyt> q
Hei hei.
$
Se siitä! Tässä on todisteesi siitä, että "foo" on palannut jäljittelemättömään luetteloon:
$ git-tila
# Haaran päällikkö
# Seurattavat tiedostot:
# (käytä "git add  ..." sisällyttääksesi mitä sitoudutaan)
# [...]
# foo
mitään ei lisätty sitoutumiseen, mutta jäljittämätön tiedosto on olemassa (käytä "git add" seurantaan)
$
|
git remove tai git rm voidaan käyttää tähän, - välimuisti-lipun kanssa. Yrittää:
git help rm
|
Näin voit välttää tämän tuskallisen ongelman, kun aloitat uuden projektin:
Luo uuden hakemistosi päähakemisto.
Suorita git init.
Luo nyt .gitignore-tiedosto (vaikka se olisi tyhjä).
Suorita .gitignore-tiedostosi.
Git tekee todella vaikeaksi tehdä git reset, jos sinulla ei ole mitään tekemistä. Jos luot pienen alkusitoumuksen vain sen saamiseksi, voit sen jälkeen lisätä -A: n ja nollata niin monta kertaa kuin haluat saada kaikki oikein.
Toinen menetelmän etu on, että jos kohtaat myöhemmin rivinvaihtoon liittyviä ongelmia ja sinun on päivitettävä kaikki tiedostosi, se on helppoa:
Tarkista alkuperäinen sitoutuminen. Tämä poistaa kaikki tiedostosi.
Tarkista sitten viimeisin sitoumus uudelleen. Tämä noutaa tuoreet kopiot tiedostoistasi nykyisten rivin lopetusasetusten avulla.
|
Ehkä Git on kehittynyt sen jälkeen kun lähetit kysymyksesi.
$> git --versio
git-versio 1.6.2.1
Nyt voit kokeilla:
git reset HEAD.
Tämän pitäisi olla etsimäsi.
|
Huomaa, että jos et määritä versiota, sinun on sisällytettävä erotin. Esimerkki konsoliltani:
git reset 
fatal: epäselvä argumentti '': tuntematon versio tai polku ei ole työpuussa.
Käytä - - erottaaksesi polut versioista
git reset - 
Vaiheettomat muutokset kuittauksen jälkeen:
M 
(Git-versio 1.7.5.4)
|
Uusien tiedostojen poistaminen lavastusalueelta (ja vain uuden tiedoston tapauksessa), kuten edellä ehdotettiin:
git rm - välimuistitiedosto
Käytä rm --cached vain vahingossa lisättyihin uusiin tiedostoihin.
|
Voit nollata jokaisen tiedoston tietyssä kansiossa (ja sen alikansioissa) käyttämällä seuraavaa komentoa:
git reset *
|
Käsittele useita tiedostoja kerralla * -komennolla:
git reset HEAD * .prj
git reset HEAD * .bmp
git reset HEAD * gdb *
jne.
|
Kirjoita vain git reset, se palaa takaisin ja se on kuin et koskaan kirjoittanut git add. viimeisestä sitoutumisestasi. Varmista, että olet sitoutunut aikaisemmin.
|
Oletetaan, että luon uuden tiedoston newFile.txt:
Oletetaan, että lisätään tiedoston vahingossa, git lisää newFile.txt:
Nyt haluan kumota tämän lisäyksen, ennen sitoutumista, git reset newFile.txt:
|
Tietty tiedosto:
git palauta my_file.txt
git checkout my_tiedosto.txt
Kaikki lisätyt tiedostot:
git nollaus.
git kassalla.
Huomaa: kassa muuttaa tiedostojen koodia ja siirtyy viimeksi päivitettyyn (sitoutuneeseen) tilaan. nollaus ei muuta koodeja; se vain nollaa otsikon.
|
Voit kumota git add -toiminnon seuraavasti:
git reset tiedostonimi
|
Tämä komento poistaa muutokset:
git nollaa HEAD-tiedostonimi.txt
Voit myös käyttää
git add -p
lisätä tiedostojen osia.
|
On myös interaktiivinen tila:
git add -i
Voit poistaa tiedostoja valitsemalla vaihtoehdon 3. Minun tapauksessani haluan usein lisätä useamman kuin yhden tiedoston, ja interaktiivisessa tilassa voit käyttää tällaisia ​​numeroita tiedostojen lisäämiseen. Tämä vie kaikki paitsi 4: 1, 2, 3 ja 5
Jos haluat valita jakson, kirjoita vain 1-5, jos haluat ottaa kaikki väliltä 1-5.
Git lavastustiedostot
|
git add myfile.txt # Tämä lisää tiedostosi tehtäväluetteloon
Melko päinvastainen kuin tämä komento on,
git reset HEAD myfile.txt # Tämä kumoase.
Joten, olet edellisessä tilassa. Määritetty on jälleen jäljittämättömässä luettelossa (edellinen tila).
Se nollaa pään tällä määritetyllä tiedostolla. joten jos pääsi ei ole sitä tarkoittaa, se yksinkertaisesti nollaa sen.
|
git reset tiedostonimi.txt
Poistaa tiedoston nimeltä tiedostonimi.txt nykyisestä hakemistosta, "sitoutumassa" -alueelta muuttamatta mitään muuta.
|
git reset tiedostonimi.txt
Poistaa tiedoston nimeltä tiedostonimi.txt nykyisestä hakemistosta, "sitoutumassa" -alueesta muuttamatta mitään muuta.
|
Sourcetree-palvelussa voit tehdä tämän helposti käyttöliittymän kautta.
Voit tarkistaa, mitä komentoa Sourcetree käyttää tiedoston poistamiseen.
Loin uuden tiedoston ja lisäsin sen Gitiin. Sitten poistin sen lavasta Sourcetree-käyttöliittymällä.
Tämä on tulos:
Tiedostojen vaiheittainen purkaminen [12.12.2015 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - polku / tiedostoon / tiedostonimi.java
Sourcetree käyttää reset-tiedostoa uusien tiedostojen vaiheistamiseen.
|
1
2
Seuraava
Erittäin aktiivinen kysymys. Ansaitse 10 mainetta vastaamiseksi tähän kysymykseen. Maineen vaatimus auttaa suojaamaan tätä kysymystä roskapostilta ja vastaamattomuudelta.
Eikö vastausta etsit? Selaa muita kysymyksiä, jotka on merkitty koodilla git version-control git-sitoutu git-vaihe tai kysy oma kysymyksesi.